package com.freeter.modules.gjs.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.freeter.modules.gjs.entity.DivisionsSites;
import com.freeter.modules.gjs.entity.MstrDivision;
import com.freeter.modules.gjs.entity.MstrSite;
import com.freeter.modules.gjs.dto.DivisionsSitesDetailDTO;
import com.freeter.modules.gjs.mapper.DivisionsSitesMapper;
import com.freeter.modules.gjs.service.DivisionsSitesService;
import com.freeter.modules.gjs.service.MstrDivisionService;
import com.freeter.modules.gjs.service.MstrSiteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

/**
 * 部门站点关联服务实现类
 * 优化后支持关联查询，返回包含部门站点详细信息的DTO
 * 
 * @author freeter
 * @since 2024-01-01
 */
@Service
public class DivisionsSitesServiceImpl implements DivisionsSitesService {

    @Autowired
    private DivisionsSitesMapper divisionsSitesMapper;
    
    @Autowired
    private MstrDivisionService mstrDivisionService;
    
    @Autowired
    private MstrSiteService mstrSiteService;

    @Override
    public List<DivisionsSites> getAllDivisionsSites() {
        Wrapper<DivisionsSites> wrapper = new EntityWrapper<>();
        return divisionsSitesMapper.selectList(wrapper);
    }

    @Override
    public DivisionsSites getDivisionsSitesById(Long id) {
        if (id == null) {
            return null;
        }
        return divisionsSitesMapper.selectById(id);
    }

    @Override
    public List<DivisionsSites> getDivisionsSitesByDivisionCode(String divisionCode) {
        if (StringUtils.isEmpty(divisionCode)) {
            return null;
        }
        Wrapper<DivisionsSites> wrapper = new EntityWrapper<>();
        wrapper.eq("division_id", divisionCode);
        return divisionsSitesMapper.selectList(wrapper);
    }

    @Override
    public List<DivisionsSites> getDivisionsSitesBySiteCode(String siteCode) {
        if (StringUtils.isEmpty(siteCode)) {
            return null;
        }
        Wrapper<DivisionsSites> wrapper = new EntityWrapper<>();
        wrapper.eq("site_code", siteCode);
        return divisionsSitesMapper.selectList(wrapper);
    }

    @Override
    public DivisionsSites getDivisionsSitesByDivisionAndSite(Long divisionId, String siteCode) {
        if (divisionId==null || StringUtils.isEmpty(siteCode)) {
            return null;
        }
        Wrapper<DivisionsSites> wrapper = new EntityWrapper<>();
        wrapper.eq("division_id", divisionId).eq("project_code", siteCode);
        List<DivisionsSites> result = divisionsSitesMapper.selectList(wrapper);
        return result.isEmpty() ? null : result.get(0);
    }

    @Override
    public DivisionsSites createDivisionsSites(DivisionsSites divisionsSites) {
        if (divisionsSites == null) {
            return null;
        }
        
        // 检查是否已存在相同的部门站点关联
        DivisionsSites existing = getDivisionsSitesByDivisionAndSite(
            divisionsSites.getDivisionId(), 
            divisionsSites.getSiteCode()
        );
        if (existing != null) {
            throw new RuntimeException("该部门站点关联已存在");
        }
        
        divisionsSitesMapper.insert(divisionsSites);
        return divisionsSites;
    }

    @Override
    public DivisionsSites updateDivisionsSites(Long id, DivisionsSites divisionsSites) {
        if (id == null || divisionsSites == null) {
            return null;
        }
        
        // 检查记录是否存在
        DivisionsSites existingDivisionsSites = divisionsSitesMapper.selectById(id);
        if (existingDivisionsSites == null) {
            return null;
        }
        
        // 更新字段
        divisionsSites.setSiteId(id);
        divisionsSitesMapper.updateById(divisionsSites);
        
        // 返回更新后的记录
        return divisionsSitesMapper.selectById(id);
    }

    @Override
    public void deleteDivisionsSites(Long id) {
        if (id == null) {
            return;
        }
        divisionsSitesMapper.deleteById(id);
    }

    @Override
    public void deleteDivisionsSitesByDivisionAndSite(String divisionCode, String siteCode) {
        if (StringUtils.isEmpty(divisionCode) || StringUtils.isEmpty(siteCode)) {
            return;
        }
        
        Wrapper<DivisionsSites> wrapper = new EntityWrapper<>();
        wrapper.eq("division_id", divisionCode).eq("site_code", siteCode);
        divisionsSitesMapper.delete(wrapper);
    }

    @Override
    public List<DivisionsSites> getDivisionsSitesByStatus(String status) {
        if (StringUtils.isEmpty(status)) {
            return null;
        }
        Wrapper<DivisionsSites> wrapper = new EntityWrapper<>();
        wrapper.eq("status", status);
        return divisionsSitesMapper.selectList(wrapper);
    }
    
    // ==================== 新增的详细信息查询方法 ====================
    
    @Override
    public List<DivisionsSitesDetailDTO> getAllDivisionsSitesDetail() {
        // 使用优化的关联查询，避免N+1查询问题
        return divisionsSitesMapper.selectDetailList();
    }

    @Override
    public DivisionsSitesDetailDTO getDivisionsSitesDetailById(Long id) {
        if (id == null) {
            return null;
        }
        // 使用优化的关联查询
        return divisionsSitesMapper.selectDetailById(id);
    }

    @Override
    public List<DivisionsSitesDetailDTO> getDivisionsSitesDetailByDivisionCode(String divisionCode) {
        if (StringUtils.isEmpty(divisionCode)) {
            return new ArrayList<>();
        }
        // 使用优化的关联查询
        return divisionsSitesMapper.selectDetailByDivisionCode(divisionCode);
    }

    @Override
    public List<DivisionsSitesDetailDTO> getDivisionsSitesDetailBySiteCode(String siteCode) {
        if (StringUtils.isEmpty(siteCode)) {
            return new ArrayList<>();
        }
        // 使用优化的关联查询
        return divisionsSitesMapper.selectDetailBySiteCode(siteCode);
    }

    @Override
    public DivisionsSitesDetailDTO getDivisionsSitesDetailByDivisionAndSite(String divisionCode, String siteCode) {
        if (StringUtils.isEmpty(divisionCode) || StringUtils.isEmpty(siteCode)) {
            return null;
        }
        // 使用优化的关联查询
        return divisionsSitesMapper.selectDetailByDivisionAndSite(divisionCode, siteCode);
    }

    @Override
    public List<DivisionsSitesDetailDTO> getDivisionsSitesDetailByStatus(String status) {
        if (StringUtils.isEmpty(status)) {
            return new ArrayList<>();
        }
        // 使用优化的关联查询
        return divisionsSitesMapper.selectDetailByStatus(status);
    }
    
    // ==================== 私有辅助方法 ====================
    
    /**
     * 将DivisionsSites实体转换为DivisionsSitesDetailDTO
     * 包含关联的部门和站点详细信息
     */
    private DivisionsSitesDetailDTO convertToDetailDTO(DivisionsSites divisionsSites) {
        if (divisionsSites == null) {
            return null;
        }
        
        DivisionsSitesDetailDTO detailDTO = new DivisionsSitesDetailDTO();
        
        // 设置关联表基本信息
        detailDTO.setSiteId(divisionsSites.getSiteId());
        detailDTO.setDivisionId(divisionsSites.getDivisionId());
        detailDTO.setSiteCode(divisionsSites.getSiteCode());
        
        // 查询并设置部门详细信息
        try {
            MstrDivision division = mstrDivisionService.getDivisionById(divisionsSites.getDivisionId());
            if (division != null) {
                detailDTO.setDivisionNameEn(division.getNameEn());
                detailDTO.setDivisionNameCn(division.getNameCn());
                detailDTO.setDivisionNameHk(division.getNameHk());
            }
        } catch (Exception e) {
            // 记录日志但不影响主流程
            System.err.println("查询部门信息失败: " + e.getMessage());
        }
        
        // 查询并设置站点详细信息
        try {
            MstrSite site = mstrSiteService.getSiteByCode(divisionsSites.getSiteCode());
            if (site != null) {
                detailDTO.setSiteName(site.getSiteInfo()); // 假设siteInfo字段包含站点名称
                // 如果MstrSite实体有其他字段，可以在这里设置
            }
        } catch (Exception e) {
            // 记录日志但不影响主流程
            System.err.println("查询站点信息失败: " + e.getMessage());
        }
        
        return detailDTO;
    }
    
    /**
     * 批量转换实体列表为DTO列表
     */
    private List<DivisionsSitesDetailDTO> convertToDetailDTOList(List<DivisionsSites> divisionsSitesList) {
        if (divisionsSitesList == null || divisionsSitesList.isEmpty()) {
            return new ArrayList<>();
        }
        
        return divisionsSitesList.stream()
            .map(this::convertToDetailDTO)
            .filter(dto -> dto != null)
            .collect(Collectors.toList());
    }
}